package yunjiao.javatutorials.guava.concurrent;

import com.google.common.util.concurrent.SettableFuture;

import java.util.concurrent.CancellationException;

/**
 * 取消 Future（cancel 方法）
 *
 * SettableFuture 支持 cancel(boolean mayInterruptIfRunning) 方法，取消后：
 * isCancelled() 返回 true，isDone() 返回 true；
 * 后续调用 set/setException 会失败；
 * 调用 get() 会抛出 CancellationException。
 *
 * @author yangyunjiao
 */
public class SettableFutureCancelDemo {
    public static void main(String[] args) {
        SettableFuture<String> future = SettableFuture.create();

        // 取消 Future（mayInterruptIfRunning：是否中断正在执行的线程，此处无执行线程，设为 false 即可）
        future.cancel(false);

        // 尝试设置结果：失败
        boolean setSuccess = future.set("测试");
        System.out.println("设置结果是否成功？" + setSuccess); // false

        // 调用 get()：抛出 CancellationException
        try {
            future.get();
        } catch (CancellationException e) {
            System.out.println("Future 已被取消"); // 输出此内容
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
